Digital distribution of content has become increasingly popular for receiving content, such as audio or video, to be rendered by a receiving device. It has also become increasingly desirable for the content to be rendered proximate the same time that the content is received or “on-demand.” At least one type of on-demand or real-time digital delivery is referred to as streaming, which attempts to maximize the quality level of the content stream, while minimizing the amount of system resources necessary for supporting the rendering of the data stream, such as the memory used for buffering or maintaining the content that is stored on the receiving and rendering device. This can sometimes be a little more challenging in a packet data network, where there is no dedicated bandwidth that can be relied upon to ensure a steady flow of data as needed on demand. In some instances, the data are transmitted across a network infrastructure that at various points along the data path can be shared among multiple users, where at any given point in time, demand among the multiple users can exceed capacity, momentarily or otherwise. Demand which exceeds capacity might not only affect a particular segment of the data path but might also occur at the server which is the source of the data stream.
In some instances, the periods of high demand, which might negatively impact the ability of the server or the communication connection to convey the data, can be transitory and can result in the data being conveyed to a particular user to arrive unevenly or in bursts. As such, many client applications that are used to render a particular data stream may make use of a data buffer, which can be used to store a modest amount of data in advance of the rendering so as to smooth over periods of time during which the data flow may dip below the rates needed for supporting the rendered content at a current quality level, even though the available average data flow is more than adequate for supporting the particular level of quality. While a larger buffer will help to accommodate a greater amount of volatility or a greater variety of flow disruptions, a larger buffer generally requires an increased amount of system resources, namely the available memory, to be used in support of the data buffer, and can increase the time needed to fill the data buffer, which correspondingly can delay the start time before the streaming content begins to be presented to the user, relative to the point in time that the user requested the content.
In addition to variances associated with sourcing and delivering the data in the data stream via the communication connection, smooth rendering of content can sometimes be affected by processor playback capabilities including disruptions of the same that similarly may be transitory in nature. For example, many current devices support multi-tasking, where the capabilities of the processor is shared among multiple applications being concurrently executed on the device. Just like there can be fluctuations in the demand of data-carrying capabilities of network resources among multiple users of network resources, various applications being executed on a device can have varying levels of demand on the processor, which can provide periods of time in which the available processing capabilities for a particular application may be below what is necessary for supporting the current processing needs in accordance with the current operating setting without the user noticing a degradation in performance.
Generally, higher fidelity data streams require larger amounts of data and greater processing power for decoding and rendering the content. Alternatively lower fidelity data streams generally require smaller amounts of data and less processing power for decoding and rendering the content. As such, one can sometimes manage the performance of the playback by managing the level of quality of the streamed data to be rendered. However, generally, where possible most users will desire that their requested streams of data to be rendered using the highest level of quality that does not negatively impact the smooth uninterrupted presentation of the rendered data.
Adaptive streaming allows the level of quality to be adjusted during rendering, so as to better match the available data capacity of the communication channel as well as the processor playback capability of the device at any particular time. In at least some instances, the server will monitor the data buffer in the receiving device including the ratio of a current window size relative to a maximum window size in determining what level of quality of the data stream should be provided to the receiving device. The maximum window size is generally a fixed size that is allocated when the data connection is opened. For a particular data stream, multiple connections may be opened during the duration of delivery of the data stream. The current window size generally includes the space available in the data buffer for packets of data yet to be received as well as in at least some instances the space associated with packets of data which have been conveyed to the device but which have not yet been acknowledged. Alternatively, space typically excluded from the value of the current window size includes packets of data which have been received and acknowledged but which have not yet been used by the rendering application. During disruptions in the processing capabilities provided for the rendering of the received content, packets of data, which have been received, acknowledged, but not yet consumed by the application, can increase in the data buffer relative to the overall maximum window size of the data buffer, thereby reducing the available current window size for receiving more data. The server seeing a decrease in the current window size may determine that the device is unable to support the current data flow for a particular level of quality, where an amount of data is buffered based on a predetermined amount of time deemed desirable for smoothing over the possible variability. This may be the result of a degradation in the ability of the device to receive or render the data. Correspondingly, the server may reduce the level of quality of subsequently streamed data segments.
Generally, the value of the current window size is communicated to the server in packets sent to the server from the receiving device. In some instances, the current window size can be included in most or even sometimes all packets sent by the receiving device to the server. Because the processor loads that negatively affect available processing capabilities for rendering streamed data can sometimes occur as momentary spikes which can measurably impact the current window size which is reported to the server, in some instances the server may react to a decrease in the current window size based upon a degradation in processor performance that is only transitory in nature. While the level of quality can generally be both increased and decreased as appropriate, there can sometimes be significant delay in making changes in the current quality settings that return or increase the level of quality relative to the current capabilities of the device.